#include "front/text_normalize.h"

using namespace std;
using namespace ppspeech;


const wregex mcWregexSlashUnit(L"(\\d+)(\\.\\d+)?([\\u4e00-\\u9fa5]+)/(（?[\\u4e00-\\u9fa5]+)");

const vector<string> mcVecStr_SlashUnitA = {
	"平方千米", "平方分米", "平方厘米", "平方毫米",
	"立方千米", "立方分米", "立方厘米", "立方毫米",

	"平方米", "立方米",

	"千米", "分米", "厘米", "毫米", "微米", "纳米",
	"分升", "毫升", "厘升", "微升", "盎司", "克拉",
	"千克",	"毫克",	"微克",
	"赫兹",
	"千瓦", "焦耳",
	"美元", "公里", 

	"米", "升", "克", "吨", "磅", "帕", "瓦", "焦", "牛", "安", "伏", "欧", "法",
	"时", "分", "秒",
	"元", "里", 
	"片", "转",
	"把", "瓣", "包", "本", "笔", "部", "册", "层", "场", "处", "串", "床",
	"沓", "道", "滴", "叠", "顶", "栋", "堵", "段", "堆", "对", "顿", "朵", "发", "份",
	"封", "幅", "服", "副", "杆", "个", "根", "股", "户", "伙", "家", "架", "间", "件",
	"节", "截", "届", "句", "具", "卷", "棵", "颗", "口", "块", "捆", "粒", "辆", "绺",
	"缕", "摞", "枚", "门", "面", "名", "盘", "匹", "篇", "期", "群", "扇", "身",
	"首", "束", "双", "艘", "所", "台", "摊", "堂", "套", "条", "听", "头", "团", "位", 
	"只", "张", "号"
};


const vector<string> mcVecStr_SlashUnitB = {
	"平方千米", "平方分米", "平方厘米", "平方毫米",
	"立方千米", "立方分米", "立方厘米", "立方毫米",

	"平方米", "立方米",

	"平米",
	"千米", "分米", "厘米", "毫米", "微米", "纳米",
	"分升", "毫升", "厘升", "微升", "盎司", "克拉",
	"千克",	"毫克",	"微克",

	"米", "升", "克", "吨", "磅", "帕", "瓦", "焦", "牛", "安", "伏", "欧", "法",
	"时", "分", "秒",
	"元", "里", 

	"套", "月", "注", "张", "平",
	"把", "瓣", "包", "本", "笔", "部", "册", "层", "场", "处", "串", "床",
	"沓", "道", "滴", "叠", "顶", "栋", "堵", "段", "堆", "对", "顿", "朵", "发", "份",
	"封", "幅", "服", "副", "杆", "个", "根", "股", "户", "伙", "家", "架", "间", "件",
	"节", "截", "届", "句", "具", "卷", "棵", "颗", "口", "块", "捆", "粒", "辆", "绺",
	"缕", "摞", "枚", "门", "面", "名", "盘", "匹", "片", "篇", "期", "群", "扇", "身",
	"首", "束", "双", "艘", "所", "台", "摊", "堂", "条", "听", "头", "团", "位", 
	"只", "号"
};

void TextNormalizer::TnReSlashUnit(wstring* fpInWsentence, const LanguageEnum fcInLanguage)
{
	wsmatch tWsmatch;
	while (regex_search(*fpInWsentence, tWsmatch, mcWregexSlashUnit)) {
		string tStrSlashUnit = wstring2utf8string(tWsmatch[0]);		//匹配到斜杠的字符串
		StrReplace(tStrSlashUnit, "（", "");
		StrReplace(tStrSlashUnit, "）", "");

		string tStrNumber = "";
		for(const char tcChar : tStrSlashUnit) {
			if(IsCharNumber(tcChar) || tcChar == '.') {
				tStrNumber += tcChar;
			}
			else {
				break;
			}
		}


		const string tcStrUnit = tStrSlashUnit.substr(tStrNumber.length());
		const vector<string> tcItemSlashUnit = StrSplit(tcStrUnit, "/");

		const string tcStrUnitA = (tcItemSlashUnit.size() > 0) ? tcItemSlashUnit[0] : "";
		const string tcStrUnitB = (tcItemSlashUnit.size() > 1) ? tcItemSlashUnit[1] : "";

		string tStrReplace;
		if( tStrNumber == "2" && (tcStrUnitA == "两") ) {	//"2两"读成"二两"
			tStrReplace = "二";
		}
		else {
			tStrReplace = ReplaceMethod(vector<string>{tStrNumber}, (fcInLanguage==LANG_EN)?RME_en_negative_decimal:RME_zh_integer_1yix_2liang3_yi1);	//取正整数部分
		}


		bool tbMatchUnitB = false;
		if(tcStrUnitB != "") {
			for(const string tcUnitB : mcVecStr_SlashUnitB) {
				if( tcUnitB.length() <= tcStrUnitB.length() ) {
					if( tcUnitB == tcStrUnitB.substr(0, tcUnitB.length()) ) {
						tbMatchUnitB = true;
						break;
					}
				}
			}
		}

		//匹配到比如“元/套”
		if(tbMatchUnitB  &&  tcStrUnitA != ""  &&  find(mcVecStr_SlashUnitA.begin(), mcVecStr_SlashUnitA.end(), tcStrUnitA) != mcVecStr_SlashUnitA.end() ) {
			tStrReplace += tcStrUnitA + "每" + tcStrUnitB;
		}
		else {
			tStrReplace += tcStrUnitA + " / " + tcStrUnitB;
		}

		WstrReplacePosition(fpInWsentence, tWsmatch.position(0), tWsmatch.length(0), utf8string2wstring(tStrReplace));
	}
}
